﻿#pragma once

#include "MathOperation.h"

namespace ASL
{

    // 简易控制器模型
    class ASL_API Controller
    {
    public:
        // 构造函数
        Controller();

        // 析构函数
        ~Controller();

        // 初始化函数
        // 输入 stepSize 仿真步长 s
        // 返回 -
        void initialize(double stepSize);

        // 单步运行函数
        // 输入 uP 比例误差信号 -
        // 输入 uI 积分误差信号 -
        // 输入 uD 微分误差信号 -
        // 返回 return 控制信号 -
        double step(double uP, double uI, double uD);

    public:
        // 比例控制系数 -
        double vP;

        // 积分控制系数 -
        double vI;

        // 微分控制系数 -
        double vD;

    public:
        // 积分器
        ASL::Calculus cIntegrator;

        // 微分器
        ASL::Calculus cDerivative;
    };

    // F16战隼式战斗机控制系统模型
    class ASL_API F16ControlSystem
    {
    public:
        // 构造函数
        F16ControlSystem();

        // 析构函数
        ~F16ControlSystem();

        // 初始化函数
        // 输入 stepSize 仿真步长 s
        // 返回 return 执行状态 -
        bool initialize(double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 马赫数 -
            double mach;

            // 攻角 deg
            double alpha;

            // 侧滑角 deg
            double beta;

            // 姿态角 deg
            ASL::Vector eular;

            // 角速度 deg/s
            ASL::Vector omega;

            // 机体过载 - 机体系 [X, Y, Z]
            ASL::Vector g;

            // 飞行速度 m/s 导航系 [X, Y, Z]
            ASL::Vector vNav;

            // 校正空速 m/s
            double vCAS;

            // 副翼操纵指令 -1~+1
            double aileronCommand;

            // 方向舵操纵指令 -1~+1
            double rudderCommand;

            // 升降舵操纵指令 -1~+1
            double elevatorCommand;

            // 减速板操纵指令 0/1
            int speedBrakeCommand;

            // 起落架位置 0~1
            double landingGear;

            // 后轮触地状态 - L And R
            bool wheelReaction;
        };

        // 输出端口列表
        struct Output
        {
            // 副翼偏转指令 -20~+20 deg
            double aileron;
            double aileronL;
            double aileronR;

            // 方向舵偏转指令 -30~+30 deg
            double rudder;

            // 升降舵偏转指令 -25~+25 deg
            double elevator;
            double elevatorL;
            double elevatorR;

            // 前缘襟翼偏转指令 -2~+25 deg
            double leadingEdgeFlap;

            // 后缘襟翼偏转指令 -2~+20 deg
            double trailingEdgeFlap;

            // 减速板偏转指令 0~60 deg
            double speedBrake;

            // 襟副翼偏转指令 -20~+20 deg
            double flaperon;
            double flaperonL;
            double flaperonR;
        };

        // 参数端口列表
        struct Parameter
        {
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        F16ControlSystem::Input input;

        // 输入端口对象
        F16ControlSystem::Output output;

        // 参数端口对象
        F16ControlSystem::Parameter parameter;

        // 监控端口对象
        F16ControlSystem::Watch watch;

    private:
        // 坐标系投影矩阵 导航系>机体系
        ASL::Matrix cN2B;

        // 飞行速度 m/s 机体系 [X, Y, Z]
        ASL::Vector vBody;

        // 控制器
        ASL::Controller cRollRate;
        ASL::Controller cGLoad;
        ASL::Controller cYawLoad;
    };

    // F22猛禽式战斗机控制系统模型
    class ASL_API F22ControlSystem
    {
    public:
        // 构造函数
        F22ControlSystem();

        // 析构函数
        ~F22ControlSystem();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 输入 stepSize 仿真步长 s
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir, double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

        // 动力调节函数
        // 输入 throttleCommond 动力控制指令 0~1
        // 返回 return 节流阀指令 0~1
        double throttle(double throttleCommand);

    public:
        // 输入端口列表
        struct Input
        {
            // 马赫数 -
            double mach;

            // 攻角 deg
            double alpha;

            // 侧滑角 deg
            double beta;

            // 姿态角 deg
            ASL::Vector eular;

            // 角速度 deg/s
            ASL::Vector omega;

            // 机体过载 - 机体系 [X, Y, Z]
            ASL::Vector g;

            // 飞行速度 m/s 导航系 [X, Y, Z]
            ASL::Vector vNav;

            // 校正空速 m/s
            double vCAS;

            // 海拔高度 m
            double altitudeSL;

            // 动静压强比 -
            double pressureRatio;

            // 副翼操纵指令 -1~+1
            double aileronCommand;

            // 方向舵操纵指令 -1~+1
            double rudderCommand;

            // 升降舵操纵指令 -1~+1
            double elevatorCommand;

            // 减速板操纵指令 0/1
            int speedBrakeCommand;

            // 起落架位置 0~1
            double landingGear;

            // 后轮触地状态 - L And R
            bool wheelReaction;
        };

        // 输出端口列表
        struct Output
        {
            // 副翼偏转指令 -25~+25 deg
            double aileron;

            // 方向舵偏转指令 -30~+30 deg
            double rudder;

            // 升降舵偏转指令 -30~+30 deg
            double elevator;

            // 前缘襟翼偏转指令 0~+35 deg
            double leadingEdgeFlap;

            // 后缘襟翼偏转指令 0~+30 deg
            double trailingEdgeFlap;

            // 减速板偏转指令 0~60 deg
            double speedBrake;

            // 推力矢量偏转指令 -20~+20 deg
            double thrustVector;
        };

        // 参数端口列表
        struct Parameter
        {
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        F22ControlSystem::Input input;

        // 输入端口对象
        F22ControlSystem::Output output;

        // 参数端口对象
        F22ControlSystem::Parameter parameter;

        // 监控端口对象
        F22ControlSystem::Watch watch;

    private:
        // 坐标系投影矩阵 导航系>机体系
        ASL::Matrix cN2B;

        // 飞行速度 m/s 机体系 [X, Y, Z]
        ASL::Vector vBody;

        // 控制系数
        ASL::LookupTable vRollLimit;
        ASL::LookupTable vRollCommandA;
        ASL::LookupTable vRollCommandB;
        ASL::LookupTable vRollCommandC;
        ASL::LookupTable vRollCommandD;

        ASL::LookupTable vYawLimit;
        ASL::LookupTable vYawOver;
        ASL::LookupTable vYawCommandA;
        ASL::LookupTable vYawCommandB;
        ASL::LookupTable vYawCommandC;
        ASL::LookupTable vYawCommandD;

        ASL::LookupTable vPitchLimit;
        ASL::LookupTable vPitchG;
        ASL::LookupTable vPitchCommandA;
        ASL::LookupTable vPitchCommandB;
        ASL::LookupTable vPitchCommandC;

        ASL::LookupTable vThrottleLimit;
        ASL::LookupTable vThrustVectorTrim;
        ASL::LookupTable vThrustVectorOver;
        ASL::LookupTable vThrustVectorCommandA;
        ASL::LookupTable vThrustVectorCommandB;
        ASL::LookupTable vThrustVectorCommandC;
        ASL::LookupTable vThrustVectorCommandD;
        ASL::LookupTable vThrustVectorCommandE;

        // 积分器
        ASL::Calculus cRollRate;
        ASL::Calculus cYawRate;
        ASL::Calculus cPitchRate;

        // 滤波器
        ASL::TransferFunction sYawRate;
        ASL::TransferFunction sAlpha;
    };

    // A320空客民航客机控制系统模型
    class ASL_API A320ControlSystem
    {
    public:
        // 构造函数
        A320ControlSystem();

        // 析构函数
        ~A320ControlSystem();

        // 初始化函数
        // 输入 stepSize 仿真步长 s
        // 返回 return 执行状态 -
        bool initialize(double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 马赫数 -
            double mach;

            // 攻角 deg
            double alpha;

            // 侧滑角 deg
            double beta;

            // 姿态角 deg
            ASL::Vector eular;

            // 角速度 deg/s
            ASL::Vector omega;

            // 副翼操纵指令 -1~+1
            double aileronCommand;

            // 方向舵操纵指令 -1~+1
            double rudderCommand;

            // 升降舵操纵指令 -1~+1
            double elevatorCommand;

            // 襟翼操纵指令 0~1
            double flapCommand;

            // 减速板操纵指令 0~1
            double speedBrakeCommand;
        };

        // 输出端口列表
        struct Output
        {
            // 副翼偏转指令 -20~+15 deg
            double aileron;
            double aileronL;
            double aileronR;

            // 方向舵偏转指令 -25~+25 deg
            double rudder;

            // 升降舵偏转指令 -25~+35 deg
            double elevator;

            // 襟翼偏转指令 0~40 deg
            double flap;

            // 减速板偏转指令 0~1
            double speedBrake;
        };

        // 参数端口列表
        struct Parameter
        {
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        A320ControlSystem::Input input;

        // 输入端口对象
        A320ControlSystem::Output output;

        // 参数端口对象
        A320ControlSystem::Parameter parameter;

        // 监控端口对象
        A320ControlSystem::Watch watch;

    private:
    };

    // B737波音民航客机控制系统模型
    class ASL_API B737ControlSystem
    {
    public:
        // 构造函数
        B737ControlSystem();

        // 析构函数
        ~B737ControlSystem();

        // 初始化函数
        // 输入 stepSize 仿真步长 s
        // 返回 return 执行状态 -
        bool initialize(double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 马赫数 -
            double mach;

            // 姿态角 deg
            ASL::Vector eular;

            // 角速度 deg/s
            ASL::Vector omega;

            // 副翼操纵指令 -1~+1
            double aileronCommand;

            // 方向舵操纵指令 -1~+1
            double rudderCommand;

            // 升降舵操纵指令 -1~+1
            double elevatorCommand;

            // 襟翼操纵指令 0~1
            double flapCommand;

            // 减速板操纵指令 0~1
            double speedBrakeCommand;

            // 扰流板操纵指令 0~1
            double spoilerCommand;
        };

        // 输出端口列表
        struct Output
        {
            // 副翼偏转指令 -20~+20 deg
            double aileron;
            double aileronL;
            double aileronR;

            // 方向舵偏转指令 -20~+20 deg
            double rudder;

            // 升降舵偏转指令 -15~+15 deg
            double elevator;

            // 襟翼偏转指令 0~1
            double flap;

            // 减速板偏转指令 0~1
            double speedBrake;

            // 扰流板偏转指令 0~1
            double spoiler;
        };

        // 参数端口列表
        struct Parameter
        {
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        B737ControlSystem::Input input;

        // 输入端口对象
        B737ControlSystem::Output output;

        // 参数端口对象
        B737ControlSystem::Parameter parameter;

        // 监控端口对象
        B737ControlSystem::Watch watch;

    private:
    };

    // X24升力体试验机控制系统模型
    class ASL_API X24ControlSystem
    {
    public:
        // 构造函数
        X24ControlSystem();

        // 析构函数
        ~X24ControlSystem();

        // 初始化函数
        // 输入 stepSize 仿真步长 s
        // 返回 return 执行状态 -
        bool initialize(double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 姿态角 deg
            ASL::Vector eular;

            // 角速度 deg/s
            ASL::Vector omega;

            // 副翼操纵指令 -1~+1
            double aileronCommand;

            // 方向舵操纵指令 -1~+1
            double rudderCommand;

            // 升降舵操纵指令 -1~+1
            double elevatorCommand;
        };

        // 输出端口列表
        struct Output
        {
            // 副翼偏转指令 -20~+20 deg
            double aileron;

            // 方向舵偏转指令 -30~+30 deg
            double rudder;

            // 升降舵偏转指令 -15~+35 deg
            double elevator;
        };

        // 参数端口列表
        struct Parameter
        {
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        X24ControlSystem::Input input;

        // 输入端口对象
        X24ControlSystem::Output output;

        // 参数端口对象
        X24ControlSystem::Parameter parameter;

        // 监控端口对象
        X24ControlSystem::Watch watch;

    private:
    };

    // C130大力神运输机控制系统模型
    class ASL_API C130ControlSystem
    {
    public:
        // 构造函数
        C130ControlSystem();

        // 析构函数
        ~C130ControlSystem();

        // 初始化函数
        // 输入 stepSize 仿真步长 s
        // 返回 return 执行状态 -
        bool initialize(double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 副翼操纵指令 -1~+1
            double aileronCommand;

            // 方向舵操纵指令 -1~+1
            double rudderCommand;

            // 升降舵操纵指令 -1~+1
            double elevatorCommand;

            // 襟翼操纵指令 0~1
            double flapCommand;

            // 减速板操纵指令 0~1
            double speedBrakeCommand;
        };

        // 输出端口列表
        struct Output
        {
            // 副翼偏转指令 -20~+20 deg
            double aileron;

            // 方向舵偏转指令 -20~+20 deg
            double rudder;

            // 升降舵偏转指令 -20~+20 deg
            double elevator;

            // 襟翼偏转指令 0~30 deg
            double flap;

            // 减速板偏转指令 0~1
            double speedBrake;
        };

        // 参数端口列表
        struct Parameter
        {
        };

        // 监控端口列表
        struct Watch
        {
        };

    public:
        // 输入端口对象
        C130ControlSystem::Input input;

        // 输入端口对象
        C130ControlSystem::Output output;

        // 参数端口对象
        C130ControlSystem::Parameter parameter;

        // 监控端口对象
        C130ControlSystem::Watch watch;

    private:
    };

}